#include "graph.h"
using namespace std;

Graph::Graph(int V)
{
    //初始化点数
    this->V=V;
    //新建二维矩阵保存各点
    this->matrix=new int*[V];
    for(int i=0;i<V;i++)
    {
        matrix[i]=new int[V];
        //memset(matrix[i],0,sizeof(matrix[i]));
        for(int j=0;j<V;j++)
            matrix[i][j]=INF;
        matrix[i][i]=0;
    }
    this->shortest_dis=new int*[V];
    for(int i=0;i<V;i++)
    {
        shortest_dis[i]=new int[V];
        //memset(matrix[i],0,sizeof(matrix[i]));
        for(int j=0;j<V;j++)
            shortest_dis[i][j]=0;
    }
}

Graph::~Graph()
{
    for(int i=0;i<V;i++)
    {
        delete[] matrix[i];
        delete[] shortest_dis[i];
    }
}

void
Graph::addEdge(int start,int end,int weight)
{
    this->matrix[start][end]=weight;
}

void
Graph::printMap()
{
    for(int i=0;i<V;i++)
    {
        for(int j=0;j<V;j++)
        {
            cout<<matrix[i][j]<<"\t";
        }
        cout<<endl;
    }
}

void 
Graph::floyd_warshall()
{
    //复制邻接矩阵
    for(int i=0;i<V;i++)
    {
        for(int j=0;j<V;j++)
            shortest_dis[i][j]=matrix[i][j];
    }
    for(int k=0;k<V;k++)
    {
        for(int i=0;i<V;i++)
        {
            for(int j=0;j<V;j++)
                shortest_dis[i][j]=min(shortest_dis[i][j],shortest_dis[i][k]+shortest_dis[k][j]);
        }
    }
}

void 
Graph::print_shortest_path()
{
    cout<<"表示最短路径的矩阵如下："<<endl;
    for(int i=0;i<V;i++)
    {
        for(int j=0;j<V;j++)
        {
            cout<<shortest_dis[i][j]<<"\t";
        }
        cout<<endl;
    }
}


